package com.yang.builder_pattern;

import com.sun.org.apache.regexp.internal.RE;

/**
 * 在下面的 ConstructorArg 类中，
 *      当 isRef 为 true 的时候，arg 表示 String 类型，type 不需要设置；
 *      当 isRef 为 false 的时候，arg、type 都需要设置。
 * 请根据这个需求，完善 ConstructorArg 类。
 *
 * @Description: 单位
 * @Author: 杨 强
 * @CreateTime: 2022-10-31 16:28
 */
public class ConstructorArg {

    private boolean isRef;
    private Class type;
    private Object arg;

    public static ConstructorArg.Build build(){
        return new ConstructorArg.Build();
    }

    public ConstructorArg(Build build) {
        this.isRef = build.isRef;
        this.type = build.type;
        this.arg = build.arg;
    }

    @Override
    public String toString() {
        return "ConstructorArg{" +
                "isRef=" + isRef +
                ", type=" + type +
                ", arg=" + arg +
                '}';
    }

    public static class Build {
        private boolean isRef;
        private Class type;
        private Object arg;

        public ConstructorArg build(){
            // 当 isRef 为 false 的时候，arg、type 都需要设置。
            if (!this.isRef){
                if (this.arg == null){
                    throw new RuntimeException("isRef为false，请设置arg。");
                }
                if (this.type == null){
                    throw new RuntimeException("isRef为false，请设置type。");
                }
            }
            // 当 isRef 为 true 的时候 并且 arg 表示 String 类型，type 不需要设置；
            // 走到这一步说明isRef已经是true，时候值需要判断arg就行了。
            if (!(arg instanceof String)){
                if (type == null){
                    throw new RuntimeException("请设置type。");
                }
            }

            return new ConstructorArg(this);
        }


        public Build isRef(boolean ref) {
            this.isRef = ref;
            return this;
        }

        public Build type(Class type) {
            this.type = type;
            return this;
        }

        public Build arg(Object arg) {
            this.arg = arg;
            return this;
        }

    }


    public static void main(String[] args) {
        ConstructorArg build = ConstructorArg.build().isRef(true).arg("杨强").build();
        System.out.println(build);
    }
}
